package jmine.tec.persist.schema.impl.elements;

import java.util.List;

import jmine.tec.persist.schema.api.SchemaElement;
import jmine.tec.persist.schema.api.SqlDialect;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

/**
 * Elemento que representa um comentário em uma tabela ou coluna
 * 
 * @author lundberg
 */
public class CommentElement implements SchemaElement, Comparable<CommentElement> {

    private String table;

    private String column;

    private String comment;

    /**
     * Construtor de um comment de coluna
     * 
     * @param table nome da tabela
     * @param column nome da coluna comentada
     * @param comment comentário
     */
    public CommentElement(String table, String column, String comment) {
        this.table = table;
        this.column = StringUtils.isBlank(column) ? null : column;
        this.comment = comment;
    }

    /**
     * Construtor de um comment de tabela
     * 
     * @param table nome tabela comentada
     * @param comment comentário
     */
    public CommentElement(String table, String comment) {
        this(table, null, comment);
    }

    /**
     * {@inheritDoc}
     */
    public List<String> createStatements(SqlDialect dialect) {
        if (this.isTableComment()) {
            return dialect.renderComment(this.table, this.comment);
        } else {
            return dialect.renderComment(this.table, this.column, this.comment);
        }
    }

    /**
     * {@inheritDoc}
     */
    public int compareTo(CommentElement o) {
        return new CompareToBuilder().append(this.table, o.table).append(this.column, o.column).toComparison();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(this.table).append(this.column).toHashCode();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof CommentElement)) {
            return false;
        }
        CommentElement o = (CommentElement) obj;
        return new EqualsBuilder().append(this.table, o.table).append(this.column, o.column).isEquals();
    }

    /**
     * Obtém o nome da tabela comentada por este elemento.
     * 
     * @return table
     */
    public String getTable() {
        return this.table;
    }

    /**
     * Obtém o nome da coluna comentada
     * 
     * @return nome da coluna
     */
    public String getColumn() {
        return this.column;
    }

    /**
     * Obtém o comentário deste elemento
     * 
     * @return comentário
     */
    public String getComment() {
        return this.comment;
    }

    /**
     * Verifica se este comment se aplica a uma tabela.
     * 
     * @return boolean
     */
    public boolean isTableComment() {
        return this.column == null;
    }

    /**
     * Verifica se este comment se aplica a uma coluna.
     * 
     * @return boolean
     */
    public boolean isColumnComment() {
        return !this.isTableComment();
    }

    /**
     * Adiciona uma extensão ao comentário.
     * @param extension extension
     */
    public void append(String extension) {
        this.comment += extension;
    }
}
